package LC;

/**
 * @author lhn
 * @date 2024-09-21 9:37
 * 45. 跳跃游戏 II
 * 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。
 * 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说，如果你在 nums[i] 处，你可以跳转到任意 nums[i + j] 处:
 * 0 <= j <= nums[i]
 * i + j < n
 * 返回到达 nums[n - 1] 的最小跳跃次数。生成的测试用例可以到达 nums[n - 1]。
 */

public class JumpGameII {
    public static void main(String[] args) {
        int[] nums1 = {2, 3, 1, 1, 4};
        System.out.println(jump(nums1));

        int[] nums2 = {2, 3, 0, 1, 4};
        System.out.println(jump(nums2));

        int[] nums3 = {0};
        System.out.println(jump(nums3));

        int[] nums4 = {1, 2, 1, 1, 1};
        System.out.println(jump(nums4));

        int[] nums5 = {1};
        System.out.println(jump(nums5));

        int[] nums6 = {7,0,9,6,9,6,1,7,9,0,1,2,9,0,3};
        System.out.println(jump(nums6));

        int[] nums7 = {2, 1};
        System.out.println(jump(nums7));
    }

    public static int jump(int[] nums) {
        int maxReached = 0; // 表示当前能到达的最远位置
        int end = 0; //  边界范围
        int step = 0;
        for (int i = 0; i < nums.length - 1; i++) {
            maxReached = Math.max(maxReached, i + nums[i]);
            // 如果当前位置已经超过边界，则步数加一，并更新边界
            if (i == end) {
                step++;
                end = maxReached;
            }
            System.out.println("i:" + i + " step:" + step +" maxReached:" + maxReached + " end:" + end);
        }
        return step;
    }
}
